集合操作(UNION, INTERSECT, EXCEPT)

在SQL中,集合操作是一种强大的工具,用于处理多个查询的结果集。集合操作允许你将多个查询的结果合并、交集或差集。常见的集合操作包括UNION、INTERSECT和EXCEPT。本教程将详细介绍这些操作的用法、语法和实际应用。

1. UNION 操作

UNION操作用于将两个或多个SELECT语句的结果集合并成一个结果集。UNION会自动去除重复的行,如果你想保留重复的行,可以使用UNION ALL。

1.1 语法

SELECT column1, column2, ...
FROM table1
UNION [ALL]
SELECT column1, column2, ...
FROM table2;

1.2 示例

假设我们有两个表employees1和employees2,它们分别存储了不同部门的员工信息。

-- 表 employees1
CREATE TABLE employees1 (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50)
);

-- 表 employees2
CREATE TABLE employees2 (
    id SERIAL PRIMARY KEY,
    name VARCHAR(100),
    department VARCHAR(50)
);

-- 插入数据
INSERT INTO employees1 (name, department) VALUES ('Alice', 'HR'), ('Bob', 'IT');
INSERT INTO employees2 (name, department) VALUES ('Charlie', 'Sales'), ('Alice', 'HR');

现在,我们使用UNION来合并这两个表的数据:

SELECT name, department
FROM employees1
UNION
SELECT name, department
FROM employees2;

结果将是:

  name   | department
---------+-----------
 Alice   | HR
 Bob     | IT
 Charlie | Sales

1.3 实践练习

  1. 创建两个表students1和students2,分别存储不同班级的学生信息。
  2. 使用UNION操作将两个表的学生信息合并,并查看结果。

2. INTERSECT 操作

INTERSECT操作用于返回两个SELECT语句的结果集中相同的行。换句话说,它返回两个结果集的交集。

2.1 语法

SELECT column1, column2, ...
FROM table1
INTERSECT
SELECT column1, column2, ...
FROM table2;

2.2 示例

继续使用上面的employees1和employees2表,我们使用INTERSECT来查找两个表中相同的员工信息:

SELECT name, department
FROM employees1
INTERSECT
SELECT name, department
FROM employees2;

结果将是:

  name  | department
--------+-----------
 Alice  | HR

2.3 实践练习

  1. 创建两个表courses1和courses2,分别存储不同学期的课程信息。
  2. 使用INTERSECT操作查找两个学期都开设的课程。

3. EXCEPT 操作

EXCEPT操作用于返回第一个SELECT语句的结果集中存在,但不在第二个SELECT语句结果集中的行。换句话说,它返回两个结果集的差集。

3.1 语法

SELECT column1, column2, ...
FROM table1
EXCEPT
SELECT column1, column2, ...
FROM table2;

3.2 示例

继续使用employees1和employees2表,我们使用EXCEPT来查找只在employees1中存在的员工信息:

SELECT name, department
FROM employees1
EXCEPT
SELECT name, department
FROM employees2;

结果将是:

  name  | department
--------+-----------
 Bob    | IT

3.3 实践练习

  1. 创建两个表products1和products2,分别存储不同供应商的产品信息。
  2. 使用EXCEPT操作查找只在第一个供应商中存在的产品。

4. 注意事项

  1. 列数和数据类型:在进行集合操作时,两个SELECT语句的列数和数据类型必须匹配。
  2. 排序:如果你希望结果集按特定顺序排列,可以在最后一个SELECT语句后使用ORDER BY。

5. 总结

集合操作是SQL中非常强大的工具,能够帮助你轻松处理多个查询的结果集。通过UNION、INTERSECT和EXCEPT,你可以实现结果集的合并、交集和差集操作。希望本教程能帮助你更好地理解和应用这些操作。

6. 下一步

接下来,你可以继续学习SQL中的其他高级主题,如窗口函数、公共表表达式(CTE)等。这些主题将进一步增强你对SQL的理解和应用能力。


通过本教程,你应该已经掌握了UNION、INTERSECT和EXCEPT的基本用法和实际应用。继续练习和探索,你将能够更熟练地使用这些强大的SQL工具。